/**
 ###################################
 hashset 主要重点在去除重复性和怎么对比重复项
 1.重写hashcode（）方法
 2.重写equal（）方法
 ###################################
 1.Set接口
 public interface Set<E>
 extends Collection<E>
 一个不包换重复元素的collection。更确切地讲，set不包含满足e1.equals（e2）的元素对
 e1和e2，并且最多包含一个null元素。正如起名所暗示的，此接口模仿了数学上的set抽象
 
 
 HashSet
 public class HashSet<E>
 extends AbstractSet<E>
 implements Set<E>, Cloneable, java.io.Serializable
 
 1.线程不安全，存取速度快
 2.所有构造方法都是基于 一个transient 的（变量修饰符，此变量无法字节化，并无法长期保存） 
   hashmap的对象map （短期保存数据），实现set接口
 3.默认初始容量16 (2>>4 速度快 位移  2的4次方)
   加载因子0.75 
   扩容增量 翻倍  超过继续翻倍
 4.继承set 的去除重复元素。 	1.判断hashcode（）是否相同
 						2.相同判断 equals 各种属性值是否相同
 						全部相同 去除掉，有一个不同就保留
 5.hashcode 是native方法 就是本机编译语言来写的-
 6.哈希表的存储结构：数组+链表，数组里每个元素都以链表的形式存储。 每个链表的对象 放入数组中
 				对象的顺序 是通过1.对象的hashcode 在对数组的长度取余。
 7.hashcode和equal在自定义数据类型的时候需要重写，eclipse里面有方法可以直接用。
 */
/*
package com.leo.第九章_集合;

import java.util.AbstractSet;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;

public class U9_L2_Set接口_hashset类 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		hashset();
	}
	private static void hashset() {
		Set<String> set=new HashSet();
		set.add("ff");
		set.add("aa");
		set.add("bb");
		String [] names=set.toArray(new String[] {});
		for(String s:names) {
			System.out.println(s);
		}
		//c4 和c5 hashcode一样 属性相同 虽然对象不一样不过被去重了
		Cat c1=new Cat("xiao hua",1,2);
		Cat c2=new Cat("xiao bai",2,3);
		Cat c3=new Cat("xiao lv",3,4);
		Cat c4=new Cat("xiao qq",4,5);
		Cat c5=new Cat("xiao qq",4,5);
		Set<Cat> cat=new HashSet<>();
		cat.add(c1);
		cat.add(c2);
		cat.add(c3);
		cat.add(c4);
		cat.add(c5);
		//打印每个对象的tostring 方法
		for(Cat ele:cat) {
			System.out.println(ele);
		}
		//set的去重 是对象的去重，所以参数一样对象不一样也能添加进set序列中
		System.out.println(cat.size());
		System.out.println("hashcode:"+c4.hashCode()+"\n"+c5.hashCode()+"\nequal方法："+c4.equals(c5));
	}
}

class Cat{
	String name;
	int id;
	int age;
	public Cat(String name, int id, int age) {
		super();
		this.name = name;
		this.id = id;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Cat [name=" + name + ", id=" + id + ", age=" + age + "]";
	}
	public Cat() {
		super();
	}
	@Override
	public int hashCode() {
		return Objects.hash(age, id, name);
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Cat other = (Cat) obj;
		return age == other.age && id == other.id && Objects.equals(name, other.name);
	}
	
}
*/